#include "pocker.h"

#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <QApplication>
#include <QtGui>

#include "../Common/GameInfo.h"
#include "../Common/Player.h"
#include "../Common/Card.h"
#include "../Common/PokerTool.h"

using namespace std;

void *grammaire(string ch,GameInfo &gameInfo, Player &player)
{
	int i=0;

	//position sur le joueur
	string namePlayer="";
	int positionCurent=0;
	while(namePlayer != "joueur" && positionCurent != ch.size() )
	{
		int pos1= ch.find('[',positionCurent);
		namePlayer = ch.substr(pos1+1,strlen("joueur"));
		positionCurent = pos1+1;

	}


	// in joueur - etat /
	// postion sur la somme total que dispose je joueur /
	string idState="";
	while(idState != "etat" && positionCurent != ch.size())
	{
		int pos1e= ch.find('[',positionCurent);
		idState = ch.substr(pos1e+1,strlen("etat"));
		positionCurent = pos1e+1;
	}

	int posPoint1e= ch.find('[',positionCurent+1);
	int posPoint2e= ch.find(']',posPoint1e+1);
	positionCurent = posPoint2e;

	gameInfo.setGameState( PokerTool::stringToInt( ch.substr(posPoint1e+1,posPoint2e+1 -posPoint1e-2) ));

	//si fin de partie alors on stop la fonction
	//if(gameInfo.getGameState() == 5 ) return NULL;

	// in joueur - fitness /
	// Somme gagné ou perdu /
	string fit="";
	while(fit != "fitness" && positionCurent != ch.size())
	{
		int pos1e= ch.find('[',positionCurent);
		fit = ch.substr( pos1e+1,strlen("fitness") );
		positionCurent = pos1e+1;
	}

	int posPointf1e= ch.find('[',positionCurent+1);
	int posPointf2e= ch.find(']',posPointf1e+1);
	positionCurent = posPointf2e;

	player.setFitness( PokerTool::stringToInt( ch.substr(posPointf1e+1,posPointf2e+1 -posPointf1e-2) ) );

	// in joueur - winner /
	// 0 si perdant,1 si gagant /
	string win="";
	while(win != "winner" && positionCurent != ch.size())
	{
		int pos1e= ch.find('[',positionCurent);
		win = ch.substr(pos1e+1,strlen("winner"));
		positionCurent = pos1e+1;
	}

	int posPointw1e= ch.find('[',positionCurent+1);
	int posPointw2e= ch.find(']',posPointw1e+1);
	positionCurent = posPointw2e;

	gameInfo.setWinner( PokerTool::stringToInt( ch.substr(posPointw1e+1,posPointw2e+1 -posPointw1e-2) ) );

	if(gameInfo.getwinner() == 0)
     player.setFitness(-player.getFitness());

	// 0 si perdant,1 si gagant /
	string betOther="";
	while(betOther != "betOther" && positionCurent != ch.size())
	{
		int pos1e= ch.find('[',positionCurent);
		betOther = ch.substr(pos1e+1,strlen("betOther"));
		positionCurent = pos1e+1;
	}

	int posPointO1e= ch.find('[',positionCurent+1);
	int posPointO2e= ch.find(']',posPointO1e+1);
	positionCurent = posPointO2e;

	gameInfo.getPlayer(2).setBet( PokerTool::stringToInt( ch.substr(posPointO1e+1,posPointO2e+1 -posPointO1e-2) ) );

	// in joueur - strategy /
	// postion sur la strategy du joueur /
	string stra="";
	while(stra != "strategy" && positionCurent != ch.size())
	{
		int pos1= ch.find('[',positionCurent);
		stra = ch.substr(pos1+1,strlen("strategy"));
		positionCurent = pos1+1;
	}

	int posPoint1stra= ch.find('[',positionCurent+1);
	int posPoint2stra= ch.find(']',posPoint1stra+1);
	positionCurent = posPoint2stra;

	player.setStrategy( (ch.substr(posPoint1stra+1,posPoint2stra+1 -posPoint1stra-2)).c_str()  );

	// in joueur - argent /
	// postion sur la somme total que dispose je joueur /
	string arge="";
	while(arge != "argent" && positionCurent != ch.size())
	{
		int pos1= ch.find('[',positionCurent);
		arge = ch.substr(pos1+1,strlen("argent"));
		positionCurent = pos1+1;
	}

	int posPoint1= ch.find('[',positionCurent+1);
	int posPoint2= ch.find(']',posPoint1+1);
	positionCurent = posPoint2;

	player.setBankroll(PokerTool::stringToInt(  ch.substr(posPoint1+1,posPoint2+1 -posPoint1-2) ));

	// postion sur la somme total que dispose je joueur /
	string argentMin="";
	while(argentMin != "argentMin" && positionCurent != ch.size())
	{
		int pos1= ch.find('[',positionCurent);
		argentMin = ch.substr(pos1+1,strlen("argentMin"));
		positionCurent = pos1+1;
	}

	int posPointP1= ch.find('[',positionCurent+1);
	int posPointP2= ch.find(']',posPointP1+1);
	positionCurent = posPointP2;

	player.setAmountToCall( PokerTool::stringToInt(ch.substr(posPointP1+1,posPointP2+1 -posPointP1-2)) );
	gameInfo.setAmountRaised( PokerTool::stringToInt(ch.substr(posPointP1+1,posPointP2+1 -posPointP1-2)) );

	// in joueur - position /
	// postion sur la somme total que dispose je joueur /
	string positionJ="";
	while(positionJ != "position" && positionCurent != ch.size())
	{
		int pos1e= ch.find('[',positionCurent);
		positionJ = ch.substr(pos1e+1,strlen("position"));
		positionCurent = pos1e+1;
	}

	posPoint1e= ch.find('[',positionCurent+1);
	posPoint2e= ch.find(']',posPoint1e+1);
	positionCurent = posPoint2e;

	int etpos = PokerTool::stringToInt( ch.substr(posPoint1e+1,posPoint2e+1 -posPoint1e-2) );
	//pour avoir une position de 9 ou 10
	etpos +=8;
	player.setPosition( etpos );

	// in joueur - position /
	// postion sur la somme total que dispose je joueur setGameState/
	string bigblindJ="";
	while(bigblindJ != "bigblind" && positionCurent != ch.size())
	{
		int pos1e= ch.find('[',positionCurent);
		bigblindJ = ch.substr(pos1e+1,strlen("bigblind"));
		positionCurent = pos1e+1;
	}

	posPoint1e= ch.find('[',positionCurent+1);
	posPoint2e= ch.find(']',posPoint1e+1);
	positionCurent = posPoint2e;

	gameInfo.setBigBlind( PokerTool::stringToInt(ch.substr(posPoint1e+1,posPoint2e+1 -posPoint1e-2)) );

	// in joueur /
	while(positionCurent!= -1 && i < 2)
	{
		// postion sur la carte /
		string carte="";
		while(carte != "carte" && positionCurent != ch.size() )
		{
			int pos1= ch.find('[',positionCurent);
			carte = ch.substr(pos1+1,strlen("carte"));
			positionCurent = pos1+1;

		}

		int posPoint1= ch.find('[',positionCurent+1);
		int posPoint2= ch.find(',',posPoint1+1);
		int posPoint3= ch.find(',',posPoint2+1);
		int posPoint5= ch.find(',',posPoint3+1);
		int posPoint4= ch.find(']',posPoint5+1);
		positionCurent = posPoint4;

		Card * c = new Card();

		// Donnée : libelle
   		// créer un flux à partir de la chaîne à convertir
		c->setLibelle( ch.substr(posPoint1+1,posPoint2+1 -posPoint1-2).c_str() );
   		//std::istringstream iss(  ch.substr(posPoint1+1,posPoint2+1 -posPoint1-2) );
		cout << "1 : " << ch.substr(posPoint1+1,posPoint2+1 -posPoint1-2) << std::endl;

		// Donnée : couleur
		c->setCardColor(ch.substr(posPoint2+1,posPoint3+1-posPoint2-2)[0]);
		cout << "2 : " << ch.substr(posPoint2+1,posPoint3+1-posPoint2-2) << std::endl;

		// Donnée : numéro
       	c->setNumero(PokerTool::stringToInt(ch.substr(posPoint3+1,posPoint5+1-posPoint3-2)));
		cout << "3 : " << ch.substr(posPoint3+1,posPoint5+1-posPoint3-2) << std::endl;

		// Donnée : carName
		c->setCardName(ch.substr(posPoint5+1,posPoint4+1-posPoint5-2)[0]);
		cout << "4 : " << ch.substr(posPoint5+1,posPoint4+1-posPoint5-2)[0] << std::endl;

		player.hand[i]=*c;
		i++;
	}

	int k=0;
	unsigned int positionCouranteSave=-1;
	// in flop /
	while(positionCurent!= -1 && k <=4 )
	{
		positionCouranteSave = positionCurent;

		// postion sur la carte /
		string carte="";
		while(carte != "carte" && positionCurent != ch.size())
		{
			int pos1= ch.find('[',positionCurent);
			carte = ch.substr(pos1+1,strlen("carte"));
			positionCurent = pos1+1;

		}

		//libelle
		int posPoint1= ch.find('[',positionCurent+1);
		//numemro
		int posPoint2= ch.find(',',posPoint1+1);
		//cardColor
		int posPoint3= ch.find(',',posPoint2+1);
		//cardName
		int posPoint5= ch.find(',',posPoint3+1);
		int posPoint4= ch.find(']',posPoint5+1);
		positionCurent = posPoint4;

		//si on revient en arrière dans les indices		
		if( positionCouranteSave > positionCurent ) break;

		Card * c = new Card();

		// Donnée : libelle
   		// créer un flux à partir de la chaîne à convertir
		c->setLibelle( ch.substr(posPoint1+1,posPoint2+1 -posPoint1-2).c_str() );

		// Donnée : couleur
		c->setCardColor(ch.substr(posPoint2+1,posPoint3+1-posPoint2-2)[0]);

		// Donnée : numéro
       	c->setNumero(PokerTool::stringToInt(ch.substr(posPoint3+1,posPoint5+1-posPoint3-2) ));

		// Donnée : carName
		c->setCardName(ch.substr(posPoint5+1,posPoint4+1-posPoint5-2)[0]);

		gameInfo.setBoardCards(k,*c);
		k++;
	}
	return NULL;
}
